package main

import "fmt"

type Usber interface {
	start()
	stop()
}

type Phone struct {
	Name string
}

func (p Phone) start() { // 值接收者
	fmt.Println(p.Name, "is starting...")
}
func (p Phone) stop() {
	fmt.Println(p.Name, "is stopping...")
}

type Phone1 struct {
	Name string
}

func (p *Phone1) start() { // 指针接收者
	fmt.Println(p.Name, "is starting...")
}
func (p *Phone1) stop() {
	fmt.Println(p.Name, "is stopping...")
}

func main() {
	// 结构体值接收者实例化后的结构体值裂隙和结构体指针类型都可以赋值给接口变量
	var p1 = Phone{
		Name: "小米",
	}
	var p2 Usber = p1
	p2.start()

	var p3 = &Phone{
		Name: "小米",
	}
	var p4 Usber = p3
	p4.start()

// 指针接收者实例化后的结构体值裂隙和结构体指针类型都可以赋值给接口变量
	var phone1 = &Phone1{
		Name: "华为",
	}
	var phone2 Usber = phone1
	phone2.start()  // 只能这样调用

	d := &Dog{
		Name: "小黑",
	}

	var d1 Animaler1 = d // 表示让Dog实现Animaler1接口
	var d2 Animaler2 = d
	d1.SetName("小白")
	fmt.Println(d2.GetName())

	var x1 Animal = d
	x1.SetName("白")
	fmt.Println(x1.GetName())

}

// ~~~~~~~~~~~~~~~~~~~~

type Animaler1 interface {
	SetName(string)
}

type Animaler2 interface {
	GetName() string
}

type Dog struct {
	Name string
}

func (d *Dog) SetName(name string) {
	d.Name = name
}

func (d Dog) GetName() string {
	return d.Name
}

// 接口嵌套
type Ainterface interface {
	SetName(string)
}

type Binterface interface {
	GetName() string
}

type Animal interface {
	Ainterface
	Binterface
}